//
// Created by Administrator on 2021/4/15.
//

/*
如果二叉树每个节点都具有相同的值，那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时，才返回true；否则返回 false。


示例 1：



输入：[1,1,1,1,1,null,1]
输出：true
示例 2：



输入：[2,2,2,5,2]
输出：false

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/univalued-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。*/

#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include <numeric>

using namespace std;

struct TreeNode {
    int val; // 节点值
    TreeNode *left; // 左子节点
    TreeNode *right; // 右子节点

    TreeNode() : val(0), left(nullptr), right(nullptr) {}

    explicit TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}

    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

};

class Solution {
private:
    int val;
public:
    bool isUnivalTree(TreeNode *root) {
        this->val = root->val;
        return dfs(root);
    }

    bool dfs(TreeNode *root) {
        if (!root) return true;
        return (root->val == this->val) and dfs(root->left) and dfs(root->right);
    }
};

int main() {
    auto t6 = TreeNode(1);
    auto t5 = TreeNode(2);
    auto t4 = TreeNode(1);
    auto t3 = TreeNode(1, nullptr, &t6);
    auto t2 = TreeNode(1, &t4, &t5);
    auto t1 = TreeNode(1, &t2, &t3);

    Solution sol;
    cout << (sol.isUnivalTree(&t1) ? "true" : "false") << endl;
    return 0;
}